﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Data;

/// <summary>
/// Summary description for ProyectosBD
/// </summary>
public class ProyectosBD
{
	public ProyectosBD()
	{
		//
		// TODO: Add constructor logic here
		// 
	}

    //Consulta de Proyectos para cargar el grid, obtengo (id,nombre y departamento)
    public DataTable ConsultarProyectos()
    {

        DataTable resultados = new DataTable();
        SqlDataAdapter adpProyectos = new SqlDataAdapter();
        string consulta = "Select id,nombre,fechaInicial,prioridad,cliente,lider,gtiAlbrecht,";
        consulta += "gtiGarmus,estado,complejidad,pfAlbrecht,productividadHistorica, pfGarmus,productividadReal,casperJonesGarmus,";
        consulta += "isbsgGarmus,costoHora,duracionReal,costo from Proyectos";

        try
        {
            //utilizo conection string para conectarme
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando a ejecutar!
                SqlCommand cmd = new SqlCommand(consulta);
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                adpProyectos.SelectCommand = cmd;
                adpProyectos.Fill(resultados);	//pido resultados de la consulta
            }
        }
        catch
        { }

        return resultados;	//devuelvo los resultados como DataTable()
    }

    public DataTable CargarProyectos()
    {

        DataTable resultados = new DataTable();
        SqlDataAdapter adpProyectos = new SqlDataAdapter();
        string consulta = "Select id,nombre from Proyectos";

        try
        {
            //utilizo conection string para conectarme
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando a ejecutar!
                SqlCommand cmd = new SqlCommand(consulta);
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                adpProyectos.SelectCommand = cmd;
                adpProyectos.Fill(resultados);	//pido resultados de la consulta
            }
        }
        catch
        { }

        return resultados;	//devuelvo los resultados como DataTable()
    }

    //funcion de consulta de los datos especificos de un Proyecto, devuelve la entidad Proyecto	
    public ProyectoEnt ConsultarProyecto(int id)
    {
        ProyectoEnt resultado = null;
        string consulta = "Select id,nombre,fechaInicial,prioridad,cliente,lider,gtiAlbrecht,";
        consulta += "gtiGarmus,estado,complejidad,pfAlbrecht,productividadHistorica, pfGarmus,productividadReal,casperJonesGarmus,";
        consulta += "isbsgGarmus,costoHora,duracionReal,costo,descripcion,horasPersonaMes from Proyectos where id = @id";
        //utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
            //Declaracion del comando a ejecutar
            SqlCommand cmd =
                new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id)); //especificacion del parametro
            //Para consultar
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerProyecto(dr); //obtengo la entidad de Proyecto
            }
        }
        return resultado;
    }

    //leer tupla correspondiente al Proyecto
    private ProyectoEnt ObtenerProyecto(SqlDataReader dr)
    {
        ProyectoEnt resultado = null;

        if (dr.HasRows)
        {
            dr.Read();	//leo la tupla
            //obtengo los valores
            int colId = dr.GetOrdinal("Id");
            int colNombre = dr.GetOrdinal("Nombre");
            int colFechaInicial = dr.GetOrdinal("FechaInicial");
            int colPrioridad = dr.GetOrdinal("Prioridad");
            int colCliente = dr.GetOrdinal("Cliente");
            int colLider = dr.GetOrdinal("Lider");
            int colGtiAlbrecht = dr.GetOrdinal("GtiAlbrecht");
            int colGtiGarmus = dr.GetOrdinal("GtiGarmus");
            int colEstado = dr.GetOrdinal("Estado");
            int colComplejidad = dr.GetOrdinal("Complejidad");
            int colPfAlbrecht = dr.GetOrdinal("PfAlbrecht");
            int colProductividadHistorica = dr.GetOrdinal("ProductividadHistorica");
            int colPfGarmus = dr.GetOrdinal("PfGarmus");
            int colProductividadReal = dr.GetOrdinal("ProductividadReal");
            int colCasperJonesGarmus = dr.GetOrdinal("CasperJonesGarmus");
            int colIsbsgGarmus = dr.GetOrdinal("IsbsgGarmus");
            int colCostoXHora = dr.GetOrdinal("CostoHora");
            int colDuracionReal = dr.GetOrdinal("DuracionReal");
            int colCosto = dr.GetOrdinal("Costo");
            int colDescripcion = dr.GetOrdinal("Descripcion");
            int colHorasPersonaMes = dr.GetOrdinal("HorasPersonaMes");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);

            //casteo los valores al tipo correspondiente
            int id = Convert.ToInt32(valores[colId]);
            string nombre = (string)valores[colNombre];
            DateTime fechaInicial = (DateTime)valores[colFechaInicial];
            int prioridad = Convert.ToInt32(valores[colPrioridad]);
            int cliente = Convert.ToInt32(valores[colCliente]);
            int lider = Convert.ToInt32(valores[colLider]);
            int gtiAlbrecht = Convert.ToInt32(valores[colGtiAlbrecht]);
            int gtiGarmus = Convert.ToInt32(valores[colGtiGarmus]);
            string estado = (string)valores[colEstado];
            int complejidad = Convert.ToInt32(valores[colComplejidad]);

            double productividadHistorica = Convert.ToDouble(valores[colProductividadHistorica]);
            double pfGarmus = (!DBNull.Value.Equals(valores[colPfGarmus])) ? Convert.ToDouble(valores[colPfGarmus]) : 0;
            double productividadReal = (!DBNull.Value.Equals(valores[colProductividadReal])) ? Convert.ToDouble(valores[colProductividadReal]) : 0;
            double casperJonesGarmus = (!DBNull.Value.Equals(valores[colCasperJonesGarmus])) ? Convert.ToDouble(valores[colCasperJonesGarmus]) : 0;
            double isbsgGarmus = (!DBNull.Value.Equals(valores[colIsbsgGarmus])) ? Convert.ToDouble(valores[colIsbsgGarmus]) : 0;
            int costoXHora = Convert.ToInt32(valores[colCostoXHora]);
            int duracionReal = (!DBNull.Value.Equals(valores[colDuracionReal])) ? Convert.ToInt32(valores[colDuracionReal]) : 0;
            int costo = Convert.ToInt32(valores[colCosto]);
            double pfAlbrecht = (!DBNull.Value.Equals(valores[colPfAlbrecht])) ? Convert.ToDouble(valores[colPfAlbrecht]) : 0;

            string descripcion = (!DBNull.Value.Equals(valores[colDescripcion])) ? (string)valores[colDescripcion] : "";
            double horasPersonaMes = (!DBNull.Value.Equals(valores[colHorasPersonaMes])) ? Convert.ToDouble(valores[colHorasPersonaMes]) : 0; ;

            //Creo la entidad de Proyecto con los parametros correspondientes
            resultado = new ProyectoEnt(id, nombre, fechaInicial, prioridad, lider, cliente, estado,
                            complejidad, pfAlbrecht, gtiAlbrecht, gtiGarmus, productividadHistorica,
                            pfGarmus, productividadReal, casperJonesGarmus, isbsgGarmus,
                            costoXHora, duracionReal, costo, descripcion, horasPersonaMes);
        }
        return resultado; //devuelvo la entidad
    }

    //Metodo de insercion del Proyecto en la base de datos
    public bool InsertarProyecto(ProyectoEnt Proyecto)
    {
        bool resultado = true;
        string consulta = "Insert Proyectos(nombre,fechaInicial,prioridad,lider,cliente,estado,";
        consulta += "complejidad, pfAlbrecht,gtiAlbrecht, gtiGarmus, productividadHistorica,";
        consulta += "pfGarmus,productividadReal,casperJonesGarmus,isbsgGarmus,duracionEstimadaGarmus,costoHora, duracionReal,costo,descripcion)";
        consulta += "values(@nombre,@fechaInicial,@prioridad,@lider,@cliente,@estado,";
        consulta += "@complejidad,@pfAlbrecht,@gtiAlbrecht, @gtiGarmus, @productividadHistorica,";
        consulta += "@pfGarmus,@productividadReal,@casperJonesGarmus,@isbsgGarmus,@duracionEstimadaGarmus,@costoXHora, @duracionReal,@costo,@descripcion,@horasPersonaMes)";
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand(consulta);
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametro correspondientes a datos del Proyecto
                cmd.Parameters.Add(new SqlParameter("@nombre", Proyecto.Nombre));
                cmd.Parameters.Add(new SqlParameter("@fechaInicial", Proyecto.FechaInicial));
                cmd.Parameters.Add(new SqlParameter("@prioridad", Proyecto.Prioridad));
                cmd.Parameters.Add(new SqlParameter("@lider", Proyecto.Lider));
                cmd.Parameters.Add(new SqlParameter("@cliente", Proyecto.Cliente));
                cmd.Parameters.Add(new SqlParameter("@estado", Proyecto.Estado));
                cmd.Parameters.Add(new SqlParameter("@complejidad", Proyecto.Complejidad));
                cmd.Parameters.Add(new SqlParameter("@pfAlbrecht", Proyecto.PfAlbrecht));
                cmd.Parameters.Add(new SqlParameter("@gtiAlbrecht", Proyecto.GtiAlbrecht));
                cmd.Parameters.Add(new SqlParameter("@gtiGarmus", Proyecto.GtiAlbrecht));
                cmd.Parameters.Add(new SqlParameter("@productividadHistorica", Proyecto.ProductividadHistorica));
                cmd.Parameters.Add(new SqlParameter("@pfGarmus", Proyecto.PfGarmus));
                cmd.Parameters.Add(new SqlParameter("@productividadReal", Proyecto.ProductividadReal));
                cmd.Parameters.Add(new SqlParameter("@casperJonesGarmus", Proyecto.CasperJonesGarmus));
                cmd.Parameters.Add(new SqlParameter("@isbsgGarmus", Proyecto.IsbgGarmus));
                cmd.Parameters.Add(new SqlParameter("@duracionEstimadaGarmus", Proyecto.DuracionGarmus));
                cmd.Parameters.Add(new SqlParameter("@costoXHora", Proyecto.CostoXHora));
                cmd.Parameters.Add(new SqlParameter("@duracionReal", Proyecto.DuracionReal));
                cmd.Parameters.Add(new SqlParameter("@costo", Proyecto.Costo));
                cmd.Parameters.Add(new SqlParameter("@descripcion", Proyecto.Descripcion));
                cmd.Parameters.Add(new SqlParameter("@horasPersonaMes", Proyecto.HorasPersonaMes));
                cmd.ExecuteNonQuery();
            }
        }
        catch	//si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }

        return resultado;
    }

    //elimina al Proyecto de la base de datos, recibe la id del Proyecto
    public bool EliminarProyecto(int id)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Proyectos where id = @id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@id", id));
                cmd.ExecuteNonQuery();
            } 

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }

    //Metodo de actualizacion de los datos de un Proyecto
    public bool ActualizarProyecto(ProyectoEnt Proyecto, int id)
    {
        bool resultado = true;
        string consulta = "Update Proyectos set nombre=@nombre,fechaInicial=@fechaInicial,prioridad=@prioridad,lider=@lider,cliente=@cliente,estado=@estado,";
        consulta += "complejidad=@complejidad, pfAlbrecht=@pfAlbrecht,gtiAlbrecht=@gtiAlbrecht, gtiGarmus=@gtiGarmus, productividadHistorica =@productividadHistorica,";
        consulta += "pfGarmus=@pfGarmus,productividadReal=@productividadReal,casperJonesGarmus=@casperJonesGarmus,isbsgGarmus=@isbsgGarmus,costoHora=@costoXHora,";
        consulta += "duracionReal=@duracionReal, costo=@costo, descripcion=@descripcion, horasPersonaMes=@horasPersonaMes where id = @id";
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaracion del comando de modificacion
                SqlCommand cmd = new SqlCommand(consulta);
                new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego los parametros a la consulta
                cmd.Parameters.Add(new SqlParameter("@id", id));
                cmd.Parameters.Add(new SqlParameter("@nombre", Proyecto.Nombre));
                cmd.Parameters.Add(new SqlParameter("@fechaInicial", Proyecto.FechaInicial));
                cmd.Parameters.Add(new SqlParameter("@prioridad", Proyecto.Prioridad));
                cmd.Parameters.Add(new SqlParameter("@lider", Proyecto.Lider));
                cmd.Parameters.Add(new SqlParameter("@cliente", Proyecto.Cliente));
                cmd.Parameters.Add(new SqlParameter("@estado", Proyecto.Estado));
                cmd.Parameters.Add(new SqlParameter("@complejidad", Proyecto.Complejidad));
                cmd.Parameters.Add(new SqlParameter("@pfAlbrecht", Proyecto.PfAlbrecht));
                cmd.Parameters.Add(new SqlParameter("@gtiAlbrecht", Proyecto.GtiAlbrecht));
                cmd.Parameters.Add(new SqlParameter("@gtiGarmus", Proyecto.GtiGarmus));
                cmd.Parameters.Add(new SqlParameter("@productividadHistorica", Proyecto.ProductividadHistorica));
                cmd.Parameters.Add(new SqlParameter("@pfGarmus", Proyecto.PfGarmus));
                cmd.Parameters.Add(new SqlParameter("@productividadReal", Proyecto.ProductividadReal));
                cmd.Parameters.Add(new SqlParameter("@casperJonesGarmus", Proyecto.CasperJonesGarmus));
                cmd.Parameters.Add(new SqlParameter("@isbsgGarmus", Proyecto.IsbgGarmus));
                cmd.Parameters.Add(new SqlParameter("@costoXHora", Proyecto.CostoXHora));
                cmd.Parameters.Add(new SqlParameter("@duracionReal", Proyecto.DuracionReal));
                cmd.Parameters.Add(new SqlParameter("@costo", Proyecto.Costo));
                cmd.Parameters.Add(new SqlParameter("@descripcion", Proyecto.Descripcion));
                cmd.Parameters.Add(new SqlParameter("@horasPersonaMes", Proyecto.HorasPersonaMes));
                cmd.ExecuteNonQuery();
            }
        }
        catch
        {
            resultado = false; //devuelvo falso si no se logro conectar o hubo un error
        }

        return resultado;
    }


    public double CalcularProductividadHistorica(int complejidad)
    {

        double resultado = 0;
        string consulta = "SELECT PROM(ProductividadHistorica)promedio from proyecto where complejidad = @complejidad)";
        //utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
            //Declaracion del comando a ejecutar
            SqlCommand cmd =
                new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@complejidad", complejidad)); //especificacion del parametro

            //Para consultar
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();//leo la tupla
                    //obtengo los valores

                    int colPromedio = dr.GetOrdinal("Promedio");

                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);

                    //casteo los valores al tipo correspondiente
                    double promedio = Convert.ToDouble(valores[colPromedio]);

                    resultado = promedio;
                }
            }
        }
        return resultado;
    }

    public DataTable ObtenerComplejidad()
    {
        DataTable resultados = new DataTable();
        SqlDataAdapter adpProyectos = new SqlDataAdapter();

        //utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
            //Declaracion del comando a ejecutar!
            SqlCommand cmd = new SqlCommand("Select id, nombre from complejidades");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpProyectos.SelectCommand = cmd;
            adpProyectos.Fill(resultados);	//pido resultados de la consulta
        }

        return resultados;
    }


    public DataTable ObtenerEstados()
    {
        DataTable resultados = new DataTable();
        SqlDataAdapter adpProyectos = new SqlDataAdapter();

        //utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
            //Declaracion del comando a ejecutar!
            SqlCommand cmd = new SqlCommand("Select nombre from estados");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpProyectos.SelectCommand = cmd;
            adpProyectos.Fill(resultados);	//pido resultados de la consulta
        }

        return resultados;
    }

    public int ObtenerUltimoId()
    {
        int resultado = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select max(id) as ID from Proyectos");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();
                    int colId = dr.GetOrdinal("Id");
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);
                    resultado = (int)valores[colId];
                }
            }
        }
        return resultado;
    }

    
    public List<ProyectoEnt> RecuperarProyectos()
    {
        List<ProyectoEnt> listaProyectos = null;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select id AS ID, nombre AS Nombre from Proyectos");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaProyectos = this.ObtenerProyctos(dr);
            }
        }

        return listaProyectos;
    }

    //Crea una lista de Actividades que devolver a partir de los datos obtenidos por
    //la consulta en SQL y la devuelve.
    private List<ProyectoEnt> ObtenerProyctos(SqlDataReader dr)
    {
        List<ProyectoEnt> listaProyectos = new List<ProyectoEnt>();

        int colId = dr.GetOrdinal("ID");
        int colNombre = dr.GetOrdinal("Nombre");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            string nombre = (string)valores[colNombre];

            listaProyectos.Add(new ProyectoEnt(id, nombre));
        }

        return listaProyectos;
    }




    //********************************Sobrecarga para Perfiles***********************
    public List<ProyectoEnt> RecuperarProyectos(int cedula)
    {
        List<ProyectoEnt> listaProyectos = null;
        try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                SqlCommand cmd = new SqlCommand("Select p.id AS ID, p.nombre AS Nombre from Proyectos p , EmpPro emp where p.id = emp.proyectoid and emp.empleado = @cedula");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@cedula", cedula)); //especificacion del parametro

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    listaProyectos = this.ObtenerProyctos(dr);
                }
            }
        }
        catch
        { 

        }

        return listaProyectos;
    }


    public DataTable ConsultarProyectos(int cedula)
    {

        DataTable resultados = new DataTable();
        SqlDataAdapter adpProyectos = new SqlDataAdapter();
        string consulta = "Select p.id,p.nombre,p.fechaInicial,p.prioridad,p.cliente,p.lider,p.gtiAlbrecht,";
        consulta += "p.gtiGarmus,p.estado,p.complejidad,p.pfAlbrecht,p.productividadHistorica, p.pfGarmus,p.productividadReal,p.casperJonesGarmus,";
        consulta += "p.isbsgGarmus,p.costoHora,p.duracionReal,p.costo, p.descripcion from Proyectos p, EmpPro emp where p.id = emp.proyectoid and emp.empleado = @cedula";

        try
        {
            //utilizo conection string para conectarme
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando a ejecutar!
                SqlCommand cmd = new SqlCommand(consulta);
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@cedula", cedula)); //especificacion del parametro
                adpProyectos.SelectCommand = cmd;
                adpProyectos.Fill(resultados);	//pido resultados de la consulta
            }
        }
        catch
        {
        
        }

        return resultados;	//devuelvo los resultados como DataTable()
    }



    public int ObtenerEmpleadoDeCuenta(int cuenta)
    {
        int resultado = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select cedulaEmp as Cedula from cuentas where id = @id");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", cuenta)); //especificacion del parametro

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();
                    int colCedula = dr.GetOrdinal("Cedula");
                     object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);
                    resultado = (int)valores[colCedula];
                }
            }
        }
        return resultado;
    }

}
